<!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>**Spring框架：**</title>
        <style>
</style>
        
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/Microsoft/vscode/extensions/markdown-language-features/media/markdown.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/Microsoft/vscode/extensions/markdown-language-features/media/highlight.css">
<style>
            body {
                font-family: -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, 'Ubuntu', 'Droid Sans', sans-serif;
                font-size: 14px;
                line-height: 1.6;
            }
        </style>
        <style>
.task-list-item { list-style-type: none; } .task-list-item-checkbox { margin-left: -20px; vertical-align: middle; }
</style>
        
        
        
    </head>
    <body class="vscode-light">
        <h1 id="spring框架"><strong>Spring框架：</strong></h1>
<h2 id="什么是spring"><strong>什么是Spring：</strong></h2>
<p><strong>开源的</strong> <strong>控制反转</strong>、<strong>面向切面</strong>的 <strong>容器</strong> 框架</p>
<h2 id="ioc控制反转"><strong>IOC(控制反转)</strong></h2>
<p>应用程序本身不负责创建对象，而是交给其他应用程序去创建，<strong>控制权由应用转到其它的外部容器</strong>，控制的转移，叫控制反转。
属性：不创建对象（new 类）</p>
<h2 id="di依赖注入"><strong>DI(依赖注入)</strong></h2>
<pre><code><code><div>在程序运行时，由外部容器动态的把依赖对象传给应用的过程。
一般：调用构造函数、set方法注入
</div></code></code></pre>
<h2 id="aop面向切面和过滤器思想很像"><strong>AOP(面向切面)和过滤器思想很像</strong></h2>
<pre><code><code><div>通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。

什么是动态代理？
两种方式实现动态代理。
</div></code></code></pre>
<h2 id="bean的作用域"><strong>bean的作用域</strong></h2>
<pre><code><code><div>spring默认是单例模式
单例（singleton，默认值）、多例（prototype,Struts2需要多例,Servlet默认单例的）

Servlet实现了SingleThreadModel接口，就会被初始化多个实例。
struts2 用的是过滤器。
Spring MVC使用的是Servlet。
</div></code></code></pre>
<h2 id="bean在什么时候创建"><strong>bean在什么时候创建</strong></h2>
<pre><code><code><div>默认 在容器创建时创建
bean设置了lazy-init=&quot;true&quot; 在调用时创建
如果想让所有的bean在调用时创建，在beans标签上加default-lazy-init=&quot;true&quot;
</div></code></code></pre>
<h2 id="bean的注入xml略"><strong>bean的注入（xml略）</strong></h2>
<h3 id="注解装配bean"><strong>注解装配Bean</strong></h3>
<pre><code><code><div>引入相应命名空间（context）
xmlns:context
开启注解驱动
&lt;context:annotation-config/&gt;

一个bean的时候：@Resource
有多个bean的时候：@Resource(name=&quot;bean名&quot;)

</div></code></code></pre>
<h3 id="context-annotation-config-和-context-component-scan的区别"><strong>&lt;context: annotation-config&gt; 和 &lt;context: component-scan&gt;的区别</strong></h3>
<pre><code><code><div>&lt;context:annotation-config&gt; 是用于激活那些已经在spring容器里注册过的bean（无论是通过xml的方式还是通过package sanning的方式）上面的注解。
&lt;context:component-scan&gt;除了具有&lt;context:annotation-config&gt;的功能之外，&lt;context:component-scan&gt;还可以在指定的package下扫描以及注册javabean 。
</div></code></code></pre>
<h3 id="spring的resource"><strong>Spring的@Resource</strong></h3>
<pre><code><code><div>1. @Resource是javax.annotation.Resource包下的。
2. @Resource默认是按名称（注解下的属性名）装配的，然后按类型匹配，如果指定了名称，则严格的按名称装配。
3. @Resource也可以写在set方法上。
4. 一定注意，如果不指定name属性，如果有多个类型都能匹配上的话，将出错
</div></code></code></pre>
<h3 id="spring的autowired"><strong>Spring的@AutoWired</strong></h3>
<pre><code><code><div>1. 功能和Resource类似 是spring框架下的包。
2. 默认是按类型装配。
3. 默认情况下，要求依赖的对象必须存在，如果依赖对象为null将出现异常，如果想允许null, 可以加required=false
@AutoWired(required = false)
4. 如果要按名称装配，需要引入@Qualifier(&quot;bean名&quot;)
</div></code></code></pre>
<h3 id="自动扫描spring25以后"><strong>自动扫描(Spring2.5以后)</strong></h3>
<p><strong>自动扫描包含&lt;context: annotation-config/&gt;</strong></p>
<pre><code><code><div>&lt;context:component-scan base-package=&quot;包1&quot;/&gt;
&lt;context:component-scan base-package=&quot;包2&quot;/&gt;
扫描base-package中的包及其子包中含有以下注解的类（@Service,@Controller,@Repository, @Component ）


@Service用于业务层
@Controller用于控制层, Spring MVC需要注意用这个
@Repository用于数据访问层（持久层）
@Component用于其他

指定bean的名字: @注解(&quot;bean的名&quot;)
不指定bean的名字:默认名称类名首字母小写

例如： 
    @Service
    class Student{

    }
    bean名：student  
</div></code></code></pre>

    </body>
    </html>